package com.foreknow.demo19;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * 异常
 * 异常的分类
 * 所有异常(Exception)和错误(Error)超类Throwable（有些人就把它叫做异常）
 * Throwable主要分为两种
 * 1.错误(Error)
 * 一般情况下认为Error是硬伤，由于硬件原因造成的程序的出错。物理上的问题是无法通过软件进行修复的。
 * 程序一般来说无需处理Error的
 *
 * 2.异常(Exception)
 * 一般情况下我们认为Exception是软件上的逻辑错误或者设计的问题，是可以通过程序进行恢复的。管理异常其实
 * 指的就是管理这部分的内容
 *
 * 异常(Exception)的内部分类
 * 1.运行时异常(非检查性异常)-RuntimeException
 * 运行时异常：编译的时候是不报错误的，无需进行异常的处理，但是运行的时候会报错
 * 常见的运行时异常：空指针NullPointerException，数组下标越界java.lang.ArrayIndexOutOfBoundsException
 *
 * 2.检查性异常
 * 如果系统运行的时候可能产生该类异常，我们一定要写出相应的处理程序，否则编译是无法通过的。
 *
 *
 * 3.处理异常的的两种方式
 * 3.1 自行处理
 * 基本语法：
 *  try {
 *    有可能会产生异常的代码
 *  }catch(Exception e){ catch捕获异常
 *    处理异常
 *  }finally {
 *    无论有没有异常都会执行finally中的语句
 *    finally的作用：可以释放资源(比如说关闭数据库的连接)
 *  }
 * 注意：一个try后面可以有多个catch,catch中的异常类型应该由小到在
 *
 * 异常中的关键字throws可以理解为抛出异常
 * 回避异常：在定义方法的时候可以使用关键字throws来声明异常
 * 基本的语法：
 *  public void 方法名() throws Exception{}
 *  意义：这个方法有可能会产生一个Exception异常，但是我在这个方法中不去处理该异常，谁调用这个方法谁就去处理该异常
 * 笔试题：
 * 1.异常的分类
 * 2.Error与Exception的区别
 * 3.什么叫运行时异常与检查性异常的区别
 * 运行时异常在编译的时候是不会报错的，可以不处理，但是运行的时候可能出错
 * 检查性异常在编译的时候报错，要求一定要进行异常的处理，否则程序不能正常运行。
 * 4.大家常见的运行时异常
 * 空指针NullPointerException
 * 数组下标越界java.lang.ArrayIndexOutOfBoundsException
 *
 * 5.throws与throw的区别
 * 5.1 throws它表示为方法去声明一个异常(抛出异常类型)，这个方法有可能产生异常，但是不想在这个方法中处理，谁调用谁处理
 * 5.2 throw它表示人为抛出了异常(这个异常是真实存在的)，只要方法中人为抛出了异常，那么方法的调用都一定要使用try...catch来处理
 * 否则继续向外抛出(这样是无意义的)
 *
 * 6.自定义异常
 * 说明：只要编写一个类，继承java.lang.Exception或者其它的子类。
 *
 * throws在实际中是如何应用的呢？
 *
 *
 */
public class Test {

  public static void main(String[] args) {

    FileReader fileReader = null;
    try {
      fileReader = new FileReader("");
      fileReader.read();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }


    //    try {
  //      int[] array = {1,2,3,4,5};
  //      for (int i = 0;i<array.length;i++){
  //        System.out.println(array[i]);
  //      }
  //    }catch (ArrayIndexOutOfBoundsException e){
  //      System.out.println("数组下标越界异常");
  //    }catch(Exception e){
  //      System.out.println("这是一个Exception");
  //    }finally {
  //      System.out.println("释放资源......");
  //    }
  //    System.out.println("程序正常向下执行......");
  }

}
